package lambdasinaction.chap8.my;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 使用日志调试
 * 假设你试图对流操作中的流水线进行调试，该从何入手呢？你可以像下面的例子那样，使用
 * forEach 将流操作的结果日志输出到屏幕上或者记录到日志文件中
 * 不幸的是，一旦调用 forEach，整个流就会恢复运行。
 * 到底哪种方式能更有效地帮助我们理解 Stream 流水线中的每个操作（比如 map/filter/limit）产生的输出
 * 这就是流操作方法 peek 大显身手的时候。
 * peek 的设计初衷就是在流的每个元素恢复运行之前，插入执行一个动作。
 * 但是它不像 forEach 那样恢复整个流的运行，而是在一个元素上完成操作之后，
 * 它只会讲操作顺承到流水线中的下一个操作。
 * 通过 peek 操作我们能清楚地了解流水线操作中每一步的输出结果
 *
 * @author Fish
 * @since 0.0.1 2018/8/9 16:44
 */
public class MyPeek {

  public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(2,3,4,5);
    List<Integer> result = numbers.stream()
        .peek(x -> System.out.println("from stream：" + x)) // 输出来自数据源的当前元素值
        .map(x -> x + 17)
        .peek(x -> System.out.println("after map：" + x)) // 输出 map 操作的结果
        .filter(x -> x % 2 == 0)
        .peek(x -> System.out.println("after filter：" + x)) // 输出经过 filter 操作之后，剩下的元素个数
        .limit(3)
        .peek(x -> System.out.println("after limit：" + x)) // 输出经过 limit 操作之后，剩下的元素个数
        .collect(Collectors.toList());
    result.stream().forEach(System.out::println);
  }

}
